#include <iostream>
#include <string>
#include <functional>
#include <cstring>
#include <cstdlib>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<unistd.h>
#include "MyThread.hpp"

void Usage(char *arg)
{
    std::cout << "Usage:  please enter:" << std::endl;
    std::cout << arg << ' ' << "server ip " << "server port" << std::endl;
}
void InitServer(struct sockaddr_in *pserver, std::string &serverip, uint16_t &serverport)
{
    memset(pserver, 0, sizeof(struct sockaddr_in));
    pserver->sin_family = AF_INET;
    pserver->sin_port = htons(serverport);
    pserver->sin_addr.s_addr = inet_addr(serverip.c_str());
}

void sendthreaddo(int socketfd, struct sockaddr_in server)
{
    while (true)
    {
        std::string message;
        std::cout << "Please Enter Word# ";
        std::getline(std::cin, message);
        sendto(socketfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, sizeof(server)); // 给服务器发消息
    }
}
int OpenDev(const char*path,int flag)
{
    int fd=open(path,flag);
    return fd;
}
void recvthreaddo(int socketfd)
{
    int fd=OpenDev("/dev/pts/2", O_WRONLY); 
    if(fd<0)exit(1);
    while (true)
    {
        struct sockaddr_in fromwho;
        socklen_t len;
        char buffer[1024];
        ssize_t n = recvfrom(socketfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&fromwho, &len);
        if (n > 0)
        {
            buffer[n] = 0;
            dprintf(fd,"\n%s\n", buffer);
        }
    }
}
int main(int argc, char *argv[])
{
    if (argc != 3)
    {
        Usage(argv[0]);
        exit(1);
    }
    std::string serverip = argv[1];
    uint16_t serverport = std::stoi(argv[2]);
    // 创建socket套接字
    int socketfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (socketfd < 0)
    {
        std::cerr << "socket error" << std::endl;
    }
    struct sockaddr_in server;
    // 填充服务器信息，因为要给服务器发消息
    InitServer(&server, serverip, serverport);

    MyThread sendthread(std::bind(&sendthreaddo, socketfd, server), "sendthread");
    MyThread recvthread(std::bind(&recvthreaddo, socketfd), "recvthread");

    sendthread.start();
    recvthread.start();

    sendthread.join();
    recvthread.join();

    std::string message;
    while (true)
    {
        std::cout << "Please Enter Word# ";
        std::getline(std::cin, message);
        sendto(socketfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, sizeof(server)); // 给服务器发消息
        struct sockaddr_in peer;
        socklen_t len = sizeof(peer);
        char buffer[1024];
        ssize_t n = recvfrom(socketfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, &len); // 接收来自服务器的消息
        if (n > 0)
        {
            buffer[n] = 0;
            std::cout << "server translate: " << buffer << std::endl;
        }
    }

    return 0;
}


// #include <iostream>
// #include <string>
// #include <functional>
// #include <cstring>
// #include <cstdlib>
// #include <sys/types.h>
// #include <sys/socket.h>
// #include <arpa/inet.h>
// #include <netinet/in.h>
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>
// #include<unistd.h>
// #include "MyThread.hpp"

// void InitServer(struct sockaddr_in *pserver, std::string &serverip, uint16_t &serverport)
// {
//     memset(pserver, 0, sizeof(struct sockaddr_in));
//     pserver->sin_family = AF_INET;
//     pserver->sin_port = htons(serverport);
//     pserver->sin_addr.s_addr = inet_addr(serverip.c_str());
// }

// void sendthreaddo(int socketfd, struct sockaddr_in server)
// {
//     while (true)
//     {
//         std::string message;
//         std::cout << "Please Enter Word# ";
//         std::getline(std::cin, message);
//         sendto(socketfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, sizeof(server)); // 给服务器发消息
//     }
// }
// int OpenDev(const char*path,int flag)
// {
//     int fd=open(path,flag);
//     return fd;
// }
// void recvthreaddo(int socketfd)
// {
//     int fd=OpenDev("/dev/pts/2", O_WRONLY); 
//     if(fd<0)exit(1);
//     while (true)
//     {
//         struct sockaddr_in fromwho;
//         socklen_t len;
//         char buffer[1024];
//         ssize_t n = recvfrom(socketfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&fromwho, &len);
//         if (n > 0)
//         {
//             buffer[n] = 0;
//             dprintf(fd,"\n%s\n", buffer);
//         }
//     }
// }
// int main()
// {
//     std::string serverip = "116.204.73.161";
//     uint16_t serverport = 8888;
//     // 创建socket套接字
//     int socketfd = socket(AF_INET, SOCK_DGRAM, 0);
//     if (socketfd < 0)
//     {
//         std::cerr << "socket error" << std::endl;
//     }
//     struct sockaddr_in server;
//     // 填充服务器信息，因为要给服务器发消息
//     InitServer(&server, serverip, serverport);

//     MyThread sendthread(std::bind(&sendthreaddo, socketfd, server), "sendthread");
//     MyThread recvthread(std::bind(&recvthreaddo, socketfd), "recvthread");

//     sendthread.start();
//     recvthread.start();

//     sendthread.join();
//     recvthread.join();

//     std::string message;
//     while (true)
//     {
//         std::cout << "Please Enter Word# ";
//         std::getline(std::cin, message);
//         sendto(socketfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, sizeof(server)); // 给服务器发消息
//         struct sockaddr_in peer;
//         socklen_t len = sizeof(peer);
//         char buffer[1024];
//         ssize_t n = recvfrom(socketfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&peer, &len); // 接收来自服务器的消息
//         if (n > 0)
//         {
//             buffer[n] = 0;
//             std::cout << "server translate: " << buffer << std::endl;
//         }
//     }

//     return 0;
// }